using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.Look.Imagem.Entidades;

namespace MakeIT.Look.Imagem.Negocios
{
    public partial class LookDAOT : DAOT
    {

        public ClienteVO getCliente(int? idCliente, string cliente)
        {
            ClienteVO clienteVO = null;
            List<ClienteVO> listClienteVOs = getClientes(idCliente, cliente, null, null, null, null, null, null, null, null, null);
            if (listClienteVOs != null && listClienteVOs.Count > 0)
            {
                clienteVO = listClienteVOs[0];
            }
            return clienteVO;
        }

        public ClienteVO getCliente(int? idCliente)
        {
            return getCliente(idCliente, null);
        }

        public List<ClienteVO> getClientes()
        {
            return getClientes(null, null, null, null, null, null, null, null, null, null, null);
        }

        public List<ClienteVO> getClientes(int? idCliente)
        {
            return getClientes(idCliente, null, null, null, null, null, null, null, null, null, null);
        }

        public List<ClienteVO> getClientes(int? idCliente, string cliente, string email, string endereco, string bairro, string cidade, string estado, string cEP, string user, string pass, bool? ativo)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT cli.idCliente as cli_idCliente, cli.cliente as cli_cliente, cli.fone1 as cli_fone1, cli.fone2 as cli_fone2, cli.fone3 as cli_fone3, cli.email as cli_email, cli.endereco as cli_endereco, cli.numero as cli_numero, cli.complemento as cli_complemento, cli.bairro as cli_bairro, cli.cidade as cli_cidade, cli.estado as cli_estado, cli.cEP as cli_cEP, cli.user as cli_user, cli.pass as cli_pass, cli.ativo as cli_ativo, cli.cadastro as cli_cadastro, cli.cadastradoPor as cli_cadastradoPor, cli.edicao as cli_edicao, cli.editadoPor as cli_editadoPor  ");
            query.AppendLine("FROM cliente as cli ");
            if (idCliente != null)
            {
                query.AppendLine(where + "cli.idCliente=@idCliente ");
                where = "AND ";
            }
            if (cliente != null)
            {
                query.AppendLine(where + "cli.cliente LIKE @cliente ");
                where = "AND ";
            }
            if (email != null)
            {
                query.AppendLine(where + "cli.email=@email ");
                where = "AND ";
            }
            if (endereco != null)
            {
                query.AppendLine(where + "cli.endereco=@endereco ");
                where = "AND ";
            }
            if (bairro != null)
            {
                query.AppendLine(where + "cli.bairro=@bairro ");
                where = "AND ";
            }
            if (cidade != null)
            {
                query.AppendLine(where + "cli.cidade=@cidade ");
                where = "AND ";
            }
            if (estado != null)
            {
                query.AppendLine(where + "cli.estado=@estado ");
                where = "AND ";
            }
            if (cEP != null)
            {
                query.AppendLine(where + "cli.cEP=@cEP ");
                where = "AND ";
            }
            if (user != null)
            {
                query.AppendLine(where + "cli.user=@user ");
                where = "AND ";
            }
            if (pass != null)
            {
                query.AppendLine(where + "cli.pass=@pass ");
                where = "AND ";
            }
            if (ativo != null)
            {
                query.AppendLine(where + "cli.ativo=@ativo ");
                where = "AND ";
            }


            query.AppendLine("ORDER BY cli.cliente ");

            DbCommand cmd = this.getCommand();
            cmd.CommandText = query.ToString();

            if (idCliente != null) cmd.Parameters.Add(getParameter(cmd, "@idCliente", idCliente));
            if (cliente != null) cmd.Parameters.Add(getParameter(cmd, "@cliente", "%" + cliente + "%"));
            if (email != null) cmd.Parameters.Add(getParameter(cmd, "@email", email));
            if (endereco != null) cmd.Parameters.Add(getParameter(cmd, "@endereco", endereco));
            if (bairro != null) cmd.Parameters.Add(getParameter(cmd, "@bairro", bairro));
            if (cidade != null) cmd.Parameters.Add(getParameter(cmd, "@cidade", cidade));
            if (estado != null) cmd.Parameters.Add(getParameter(cmd, "@estado", estado));
            if (cEP != null) cmd.Parameters.Add(getParameter(cmd, "@cEP", cEP));
            if (user != null) cmd.Parameters.Add(getParameter(cmd, "@user", user));
            if (pass != null) cmd.Parameters.Add(getParameter(cmd, "@pass", pass));
            if (ativo != null) cmd.Parameters.Add(getParameter(cmd, "@ativo", ativo.Value ? "S" : "N"));


            DbDataReader reader = null;
            try
            {
                reader = cmd.ExecuteReader();

                List<ClienteVO> listCliente = new List<ClienteVO>();

                while (reader.Read())
                {
                    ClienteVO clienteVO = ClienteVO.CreateVO();
                    clienteVO.idCliente = reader.GetInt32(reader.GetOrdinal("cli_idCliente"));
                    clienteVO.cliente = reader.GetString(reader.GetOrdinal("cli_cliente"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_fone1")))
                        clienteVO.fone1 = reader.GetString(reader.GetOrdinal("cli_fone1"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_fone2")))
                        clienteVO.fone2 = reader.GetString(reader.GetOrdinal("cli_fone2"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_fone3")))
                        clienteVO.fone3 = reader.GetString(reader.GetOrdinal("cli_fone3"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_email")))
                        clienteVO.email = reader.GetString(reader.GetOrdinal("cli_email"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_endereco")))
                        clienteVO.endereco = reader.GetString(reader.GetOrdinal("cli_endereco"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_numero")))
                        clienteVO.numero = reader.GetString(reader.GetOrdinal("cli_numero"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_complemento")))
                        clienteVO.complemento = reader.GetString(reader.GetOrdinal("cli_complemento"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_bairro")))
                        clienteVO.bairro = reader.GetString(reader.GetOrdinal("cli_bairro"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_cidade")))
                        clienteVO.cidade = reader.GetString(reader.GetOrdinal("cli_cidade"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_estado")))
                        clienteVO.estado = reader.GetString(reader.GetOrdinal("cli_estado"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_cEP")))
                        clienteVO.cEP = reader.GetString(reader.GetOrdinal("cli_cEP"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cli_user")))
                        clienteVO.user = reader.GetString(reader.GetOrdinal("cli_user"));
                    try { clienteVO.pass = DAOT.DecryptPassword(reader["cli_pass"] as string, "Jaboticaba"); } catch { clienteVO.pass = ""; }
                    clienteVO.ativo = reader.GetString(reader.GetOrdinal("cli_ativo")).Equals("S");
                    clienteVO.cadastro = reader.GetDateTime(reader.GetOrdinal("cli_cadastro"));
                    clienteVO.cadastradoPor = reader.GetString(reader.GetOrdinal("cli_cadastradoPor"));
                    clienteVO.edicao = reader.GetDateTime(reader.GetOrdinal("cli_edicao"));
                    clienteVO.editadoPor = reader.GetString(reader.GetOrdinal("cli_editadoPor"));


                    listCliente.Add(clienteVO);
                }
                reader.Close();
                return listCliente;
            }
            catch (Exception ex) { throw ex; }
            finally
            {
                if (reader != null && !reader.IsClosed)
                    reader.Close();
            }
        }

        public void setCliente(ClienteVO clienteVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE cliente ");
            query.AppendLine("SET cliente=@cliente, fone1=@fone1, fone2=@fone2, fone3=@fone3, email=@email, endereco=@endereco, numero=@numero, complemento=@complemento, bairro=@bairro, cidade=@cidade, estado=@estado, cEP=@cEP, user=@user, " + (clienteVO.pass != null ? "pass=@pass, " : "") + "ativo=@ativo,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
            query.AppendLine("WHERE idCliente=@idCliente ");

            DbCommand cmd = this.getCommand();
            cmd.CommandText = query.ToString();

            cmd.Parameters.Add(getParameter(cmd, "@idCliente", clienteVO.idCliente));
            cmd.Parameters.Add(getParameter(cmd, "@cliente", clienteVO.cliente));
            if (clienteVO.fone1 == null)
                cmd.Parameters.Add(getParameter(cmd, "@fone1", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@fone1", clienteVO.fone1));
            if (clienteVO.fone2 == null)
                cmd.Parameters.Add(getParameter(cmd, "@fone2", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@fone2", clienteVO.fone2));
            if (clienteVO.fone3 == null)
                cmd.Parameters.Add(getParameter(cmd, "@fone3", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@fone3", clienteVO.fone3));
            if (clienteVO.email == null)
                cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@email", clienteVO.email));
            if (clienteVO.endereco == null)
                cmd.Parameters.Add(getParameter(cmd, "@endereco", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@endereco", clienteVO.endereco));
            if (clienteVO.numero == null)
                cmd.Parameters.Add(getParameter(cmd, "@numero", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@numero", clienteVO.numero));
            if (clienteVO.complemento == null)
                cmd.Parameters.Add(getParameter(cmd, "@complemento", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@complemento", clienteVO.complemento));
            if (clienteVO.bairro == null)
                cmd.Parameters.Add(getParameter(cmd, "@bairro", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@bairro", clienteVO.bairro));
            if (clienteVO.cidade == null)
                cmd.Parameters.Add(getParameter(cmd, "@cidade", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@cidade", clienteVO.cidade));
            if (clienteVO.estado == null)
                cmd.Parameters.Add(getParameter(cmd, "@estado", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@estado", clienteVO.estado));
            if (clienteVO.cEP == null)
                cmd.Parameters.Add(getParameter(cmd, "@cEP", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@cEP", clienteVO.cEP));
            if (clienteVO.user == null)
                cmd.Parameters.Add(getParameter(cmd, "@user", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@user", clienteVO.user));
            if (clienteVO.pass != null) cmd.Parameters.Add(getParameter(cmd, "@pass", DAOT.EncryptPassword(clienteVO.pass, "Jaboticaba")));
            cmd.Parameters.Add(getParameter(cmd, "@ativo", (clienteVO.ativo == null ? " " : (clienteVO.ativo.Value ? "S" : "N"))));
            cmd.Parameters.Add(getParameter(cmd, "@cadastro", clienteVO.cadastro));
            cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", clienteVO.cadastradoPor));
            cmd.Parameters.Add(getParameter(cmd, "@edicao", clienteVO.edicao));
            cmd.Parameters.Add(getParameter(cmd, "@editadoPor", clienteVO.editadoPor));

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }

        }

        public long newCliente(ClienteVO clienteVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO cliente ");
            query.AppendLine("  ( cliente, fone1, fone2, fone3, email, endereco, numero, complemento, bairro, cidade, estado, cEP, user, pass, ativo, cadastro, cadastradoPor, edicao, editadoPor ) ");
            query.AppendLine("VALUES ( @cliente, @fone1, @fone2, @fone3, @email, @endereco, @numero, @complemento, @bairro, @cidade, @estado, @cEP, @user, @pass, @ativo, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

            DbCommand cmd = this.getCommand();
            cmd.CommandText = query.ToString();

            cmd.Parameters.Add(getParameter(cmd, "@cliente", clienteVO.cliente));
            if (clienteVO.fone1 == null)
                cmd.Parameters.Add(getParameter(cmd, "@fone1", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@fone1", clienteVO.fone1));
            if (clienteVO.fone2 == null)
                cmd.Parameters.Add(getParameter(cmd, "@fone2", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@fone2", clienteVO.fone2));
            if (clienteVO.fone3 == null)
                cmd.Parameters.Add(getParameter(cmd, "@fone3", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@fone3", clienteVO.fone3));
            if (clienteVO.email == null)
                cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@email", clienteVO.email));
            if (clienteVO.endereco == null)
                cmd.Parameters.Add(getParameter(cmd, "@endereco", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@endereco", clienteVO.endereco));
            if (clienteVO.numero == null)
                cmd.Parameters.Add(getParameter(cmd, "@numero", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@numero", clienteVO.numero));
            if (clienteVO.complemento == null)
                cmd.Parameters.Add(getParameter(cmd, "@complemento", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@complemento", clienteVO.complemento));
            if (clienteVO.bairro == null)
                cmd.Parameters.Add(getParameter(cmd, "@bairro", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@bairro", clienteVO.bairro));
            if (clienteVO.cidade == null)
                cmd.Parameters.Add(getParameter(cmd, "@cidade", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@cidade", clienteVO.cidade));
            if (clienteVO.estado == null)
                cmd.Parameters.Add(getParameter(cmd, "@estado", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@estado", clienteVO.estado));
            if (clienteVO.cEP == null)
                cmd.Parameters.Add(getParameter(cmd, "@cEP", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@cEP", clienteVO.cEP));
            if (clienteVO.user == null)
                cmd.Parameters.Add(getParameter(cmd, "@user", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@user", clienteVO.user));
            if (clienteVO.pass == null) cmd.Parameters.Add(getParameter(cmd, "@pass", System.DBNull.Value));
            else cmd.Parameters.Add(getParameter(cmd, "@pass", DAOT.EncryptPassword(clienteVO.pass, "Jaboticaba")));
            cmd.Parameters.Add(getParameter(cmd, "@ativo", (clienteVO.ativo == null ? " " : (clienteVO.ativo.Value ? "S" : "N"))));
            cmd.Parameters.Add(getParameter(cmd, "@cadastro", clienteVO.cadastro));
            cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", clienteVO.cadastradoPor));
            cmd.Parameters.Add(getParameter(cmd, "@edicao", clienteVO.edicao));
            cmd.Parameters.Add(getParameter(cmd, "@editadoPor", clienteVO.editadoPor));


            try
            {
                cmd.ExecuteNonQuery();

                long newID = 0;
                if (tipo.Equals(DBType.MSSql))
                {
                    cmd.CommandText = "SELECT IDENT_CURRENT('cliente') AS 'Identity' ";
                    DbDataReader reader = cmd.ExecuteReader();
                    reader.Read();
                    newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
                    reader.Close();
                }
                else if (tipo.Equals(DBType.MySql))
                {
                    newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
                }
                else if (tipo.Equals(DBType.ODBC))
                {
                    //TODO implementar
                }
                else if (tipo.Equals(DBType.ORACLE))
                {
                    //TODO implementar
                }
                return newID;
            }
            catch (Exception ex) { throw ex; }

        }

        public void delCliente(ClienteVO clienteVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM cliente ");
            query.AppendLine("WHERE idCliente=@idCliente ");

            DbCommand cmd = getCommand();
            cmd.CommandText = query.ToString();

            cmd.Parameters.Add(getParameter(cmd, "@idCliente", clienteVO.idCliente));


            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }

        }
    }
}
